Package gameserver

Source Code of gameserver.MessageHandler

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package gameserver;

import gameserver.api.Output;
import java.util.*;
import gameserver.api.events.*;
import gameserver.api.requests.*;
import gameserver.api.responses.*;
import gameserver.dealers.Dealer;

/**
*
* @author Jorge
*/
public class MessageHandler implements Runnable {
    private final Queue<GameEvent> events = new LinkedList<GameEvent>();
   
    public MessageHandler(){
    }

    public GameResponse handleRequest(GameRequest req, User u){
        if(u == null){
            Output.error("(not suposed to happen): u == null");
        }

        PokerServer server = PokerServer.getInstance();
        GameResponse resp = null;
       
        if(req instanceof ServerRequest){
            resp = server.handleServerRequest((ServerRequest) req, u);
        }
        else if(req instanceof TableRequest){
            TableRequest reqAux = (TableRequest) req;
            Table table = server.getTable(reqAux.tablename);
            if(table != null){
                resp = table.handleTableRequest(reqAux, u);
            }
        }

        if(resp == null){
            resp = new GeneralResponse(false);
        }
        resp.id = req.id;
        return resp;
    }
    private void publishEvent(GameEvent evt){
        Output.debug("Publishing Event: "+evt);
        try{
            PokerServer server = PokerServer.getInstance();
           
            if(evt instanceof ServerEvent){
                publish(evt, server.getUsers());
            }else if(evt instanceof TableEvent){
                TableEvent e = (TableEvent) evt;
                Table t = server.getTable(e.tablename);
                if(t != null){
                    Dealer d = t.getDealer();
                    if(d != null){
                        d.notifyEvent(evt);
                    }
                    publish(evt, t.getUsers());
                }
            }else if(evt instanceof PlayerEvent){
                PlayerEvent e = (PlayerEvent) evt;
                Table t = server.getTable(e.tablename);
                if(t != null && e.seat >= 0 && e.seat < t.getSeats()){
                    TablePlayer tp = t.getPlayers()[e.seat];
                    if(tp != null){
                        User u = tp.user;
                        if(u != null)
                            publish(evt, u);
                    }
                }
            }
        }catch(Exception e){
            Output.warning(e);
        }
    }

    private void publish(GameEvent evt, User u){
        if(!u.notify(evt)){
            PokerServer.getInstance().logout(u);
        }
    }
    private void publish(GameEvent evt, Collection<User> users){
        for(User u: users){
            publish(evt, u);
        }
    }

    public void insertEvent(GameEvent evt){
        if(evt != null){
            synchronized(events){
                events.offer(evt);
                events.notify();
            }
        }
    }

    public MessageHandler init(){
        Thread t = new Thread(this);
        t.setDaemon(true);
        t.start();
        return this;
    }
    public void run(){
        while(true){
            GameEvent evt;
            synchronized(events){
                if(events.isEmpty()){
                    try{ events.wait(); }
                    catch(InterruptedException ignored){ }
                }
                if(events.isEmpty()){
                    // se saiu do wait anterior mas continua sem ter eventos
                    continue;
                }
                evt = events.poll();
            }
            publishEvent(evt);
        }
    }

}
TOP

Related Classes of gameserver.MessageHandler

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.